package com.lmy.springboot_rabbitmq.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * ttl过期时间
 */
@Configuration
public class TTLRabbitmqConfiguration {

    //1.声明注册direct模式交换机
    @Bean
    public DirectExchange ttlDirectExchange() {
        return new DirectExchange("ttl_direct_order_exchange");
    }

    //2.声明队列，并指定队列过期时间
    @Bean
    public Queue ttlDirectQueue() {
        Map<String, Object> hashMap = new HashMap<>();
        //指定过期时间 ms单位
        hashMap.put("x-message-ttl", 5000);
        //也可以在消息过期后，不丢弃，转移至死信交换机，再由死信交换机发送消息至死信队列。
        //这里绑定死信交换机 dead_direct_order_exchange，就是一个接盘侠
        hashMap.put("x-dead-letter-exchange", "dead_direct_order_exchange");
        //由于死信交换机和死信队列采用direct 路由模式进行消息分发，因此这里也需要指定routingKey
        hashMap.put("x-dead-letter-routing-key", "dead");
        return new Queue("ttl_direct_order_queue", true, false, false, hashMap);
    }

    //这里是一个普通队列，在生产者端给消息设置了过期时间
    @Bean
    public Queue ttlMessageDirectQueue() {
        Map<String, Object> hashMap = new HashMap<>();
        return new Queue("ttl_message_direct_order_queue", true, false, false);
    }

    //3.绑定关系
    @Bean
    public Binding ttlDirectBinding() {
        return BindingBuilder.bind(ttlDirectQueue()).to(ttlDirectExchange()).with("ttl");
    }

    @Bean
    public Binding ttlMessageDirectBinding() {
        return BindingBuilder.bind(ttlMessageDirectQueue()).to(ttlDirectExchange()).with("ttl_message");
    }
}
